package com.course.server.service;

import cn.hutool.core.collection.CollectionUtil;
import com.course.server.dto.FileDto;
import com.course.server.dto.PageDto;
import com.course.server.entity.File;
import com.course.server.entity.FileExample;
import com.course.server.mapper.FileMapper;
import com.course.server.util.CopyUtil;
import com.course.server.util.UuidUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author: Durian
 * @date: 2021/5/9 12:13
 */
@Service
public class FileService {

    @Resource
    private FileMapper fileMapper;

    public PageDto<FileDto> list(int page, int size) {
        PageHelper.startPage(page, size);
        FileExample example = new FileExample();
        example.setOrderByClause("created_at desc");
        // criteria只能一次
        FileExample.Criteria criteria = example.createCriteria();
        // service层尽量灵活
        List<File> files = fileMapper.selectByExample(example);
        PageInfo<File> pageInfo = new PageInfo<>(files);

        List<FileDto> fileDtos = CopyUtil.copyList(files, FileDto.class);
        PageDto<FileDto> pageDto = new PageDto<>();
        pageDto.setPage(page);
        pageDto.setSize(size);
        pageDto.setList(fileDtos);
        pageDto.setTotal(pageInfo.getTotal());
        return pageDto;
    }

    public void save(FileDto fileDto) {
        File file = new File();
        BeanUtils.copyProperties(fileDto, file);
        File keyFile = selectByKey(file.getKey());
        if (keyFile == null) {
            // 插入一条新的
            insert(file);
        } else {
            // 更新数据库已存在的
            keyFile.setShardIndex(fileDto.getShardIndex());
            update(keyFile);
        }
    }

    /**
     * 用于大文件分片的续传
     * 根据前端计算的文件MD5值查找数据库是否有对应key的文件存在
     *
     * @param key 文件标识符
     * @return 文件
     */
    private File selectByKey(String key) {
        FileExample example = new FileExample();
        FileExample.Criteria criteria = example.createCriteria();
        criteria.andKeyEqualTo(key);
        List<File> files = fileMapper.selectByExample(example);
        if (CollectionUtil.isEmpty(files)) {
            return null;
        }
        return files.get(0);
    }

    public void delete(String id) {
        fileMapper.deleteByPrimaryKey(id);
    }

    private void insert(File file) {
        file.setCreatedAt(LocalDateTime.now());
        file.setId(UuidUtils.getShortUuid());
        fileMapper.insert(file);
    }

    private void update(File file) {
        file.setUpdatedAt(LocalDateTime.now());
        fileMapper.updateByPrimaryKeySelective(file);
    }
}
